#include <bits/stdc++.h>

using namespace std;

// 字符串转化
// 给出两个长度相同的字符串str1和str2
// 请你帮忙判断字符串str1能不能在 零次 或 多次 转化后变成字符串str2
// 每一次转化时，你可以将str1中出现的所有相同字母变成其他任何小写英文字母
// 只有在字符串str1能够通过上述方式顺利转化为字符串str2时才能返回true
// 测试链接 : https://leetcode.cn/problems/string-transforms-into-another-string/

class Solution 
{
public:
    bool canConvert(string& str1, string& str2)
    {
        if(str1 == str2) return true;
        // map[x] : str2中字符x的词频
        int map[26]{};
        // kinds : str2中字符的种类数
        int kinds = 0;
        for(char ch : str2)
        {
            if(map[ch - 'a']++ == 0) ++kinds;
        }
        // str2 中有 26 个小写字母，则无法完成转换
        if(kinds == 26) return false;
        memset(map, -1, sizeof map);
        // map[x] = y : str1中的字符x上次出现在str1中的y位置
        for(int i = 0, cur; i < str1.size(); ++i)
        {
            cur = str1[i] - 'a';
            // map[cur] != -1 : cur 有出现过
            // 上一次 cur 对应的字符要和此次 cur 对应的字符要相同
            if(map[cur] != -1 && str2[map[cur]] != str2[i]) return false;
            map[cur] = i;
        }
        return true;
    }
};